package com.example.ten.service.impl;

import com.example.ten.dao.MenuDao;
import com.example.ten.entity.User;
import com.example.ten.entity.TreeNode;
import com.example.ten.service.MenuService;
import org.springframework.stereotype.Service;


import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: Jyc
 * @classname: MenuDaoImpl
 * @date: 2023/3/28
 * @time: 20:55
 * @description:
 */
@Service
public class MenuServiceImpl implements MenuService {
    @Resource
    private MenuDao menuDao;

    //依赖注入session   该session和shiro的session相通的
    @Resource
    private HttpSession session;

    @Override
    public List<TreeNode> queryTreeNodeByUserId() {
        //从session获取当前登录登录的对象
        User user =   (User) session.getAttribute("userInfo");
        //查询所有数据
        List<TreeNode> treeNodeList = menuDao.queryTreeNodeByUserId(user.getUserId());
        //定义返回数据列表 拼装成前端要的格式
        List<TreeNode> returnTreeNodeList = new ArrayList<>();
        //循环所有数据
        for (TreeNode treeNode : treeNodeList) {
            //判断是否是根节点，如果是直接添加到返回集合
            if(treeNode.getParentId()==0){
                //一级节点添加返回集合
                returnTreeNodeList.add(treeNode);
                //绑定孩子节点
                bindChild(treeNode,treeNodeList);
            }
        }
        return returnTreeNodeList;
    }

    @Override
    public List<TreeNode> queryTreeNodeData() {
        //查询所有数据
        List<TreeNode> treeNodeList = menuDao.queryTreeNodeData();
        //定义返回数据列表 拼装成前端要的格式
        List<TreeNode> returnTreeNodeList = new ArrayList<>();
        //循环所有数据
        for (TreeNode treeNode : treeNodeList) {
            //判断是否是根节点，如果是直接添加到返回集合
            if(treeNode.getParentId()==0){
                //一级节点添加返回集合
                returnTreeNodeList.add(treeNode);
                //绑定孩子节点
                bindChild(treeNode,treeNodeList);
            }
        }
        return returnTreeNodeList;
    }

    /**
     * 为当前节点绑定子节点
     * @param currentNode
     * @param treeNodeList
     */
    private void bindChild(TreeNode currentNode,List<TreeNode> treeNodeList){
        //循环
        for (TreeNode treeNode : treeNodeList) {
            //为当前节点绑定子节点
            //    判断当前循环节点的父ID是否等于当前节点的ID
            if(treeNode.getParentId()==currentNode.getId()){
                //获取当前节点的孩子集合
                List<TreeNode> children = currentNode.getChildren();
                //判断孩子集合是否为空
                if(children==null){
                    //实例化子节点集合
                    children = new ArrayList<>();
                }
                //添加孩子
                children.add(treeNode);
                //设置孩子集合
                currentNode.setChildren(children);
                //递归为当前节点找孩子
                bindChild(treeNode,treeNodeList);
            }
        }
    }

    @Override
    public int add(TreeNode treeNode) {
        return menuDao.add(treeNode);
    }

    @Override
    public int update(TreeNode treeNode) {
        return menuDao.update(treeNode);
    }

    @Override
    public int delete(int menuId) {
        return menuDao.delete(menuId);
    }
}
